// 核心：拦截需要Mock的客户端请求，并为该请求响应Mock数据
import fs from 'fs';
import path from 'path';

// 为什么export default函数，而不是直接export default对象？若是对象则无法传入形参options则无法进行配置，使用函数更加灵活
export default (
  options = {}
) => {
  return {
    name: 'my-vite-plugin-mock',
    // configureServer是Vite的钩子函数，配置开发服务器的钩子
    configureServer(server) {
      // 解析mock/index.js文件内容，mock/index.js目录结构是约定的
      let mockConfig = [];
      if (fs.statSync('mock').isDirectory()) {
        mockConfig = require(path.resolve(process.cwd(), 'mock', 'index.js'));
      }

      server.middlewares.use((req, res, next) => { // NodeJS中间件
        // 若请求URL存在Mock配置则响应模拟数据
        const mockConfigItem = mockConfig.find(item => item.url === req.url)
        if (mockConfigItem) {
          res.setHeader("Content-Type", "application/json");
          res.end(JSON.stringify(mockConfigItem.response()))
        } else {
          next()
        }
      });
    }
  };
}